
/**
 * 防抖函数
 * @param func 要防抖的函数
 * @param delay 防抖延迟时间（毫秒）
 * @param immediate 是否立即执行第一次调用
 * @returns 防抖后的函数
 */
export default function debounce<T extends (...args: any[]) => any>(
    func: T,
    delay: number,
    immediate?: boolean,
): (...args: Parameters<T>) => void {
    let timeout: ReturnType<typeof setTimeout> | null = null
    return function (...args) {
        if (timeout) {
            clearTimeout(timeout)
        }
        if (immediate && !timeout) {
            func(...args)
        }
        timeout = setTimeout(() => {
            func(...args)
        }, delay)
    }
}
